package com.cskaoyan.javase.exception.handle2.throws3.override1;

/**
 * @description: 方法覆盖中的异常列表匹配问题
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

import java.security.acl.AclNotFoundException;

/**
 * 方法的重写：
 * 必须一样的：方法名+参数列表
 * 访问权限：子类重写后的访问权限必须大于（更松）等于父类
 * 返回值类型：如果是基本数据类型，必须保持一模一样
 * 如果是引用数据类型：如果是引用数据类型，可以是一样的，也可以是子类
 * 方法声明中抛出的异常：
 * 总体上的原则是：子类中的覆盖方法，不能比父类中的方法抛出更多异常
 * 原因：
 * 由于Java中具有多态性，当你用父类引用调用方法时，具体的行为是显式子类的
 * 这个时候如果子类重写方法比父类中的异常还要多，这个时候就无法达到预处理异常的效果了
 *
 * 思考：
 * 如果子类比父类抛出了更多的运行时异常，这样算不算多抛出？
 * 不算，因为即便你不声明抛出运行时异常，只要你方法中有运行时异常那么它还是会自动抛出
 * 所以对于运行时异常写不写抛出 效果一样
 *
 * 1，如果父类不抛出异常
 *  子类重写方法能抛出异常吗？
 *  可以抛，但是只能抛出运行时异常，抛出编译时异常就报错，也不能抛出Exception
 *
 * 2，如果父类的方法抛出异常：
 *  a,如果父类抛出是运行时异常，不管抛出的是哪个
 *  子类随便抛出运行时异常，但是不能抛出编译时异常，Exception
 *  b，如果父类抛出的是编译时异常，
 *  子类方法可以抛出运行时异常，或者抛出一样的编译时异常，不能抛出别的编译时异常，也不能抛出Exception
 *
 *  c，如果父类方法抛出的是Exception
 *  子类方法随便抛出，随便抛运行时异常，编译时异常，或者Exception
 *
 *
 */
public class Demo {

}

class Father{
    public void test() throws Exception {}
}
class Son extends Father{
    @Override
    public void test() throws CloneNotSupportedException,AclNotFoundException  {
        //super.test();
    }
}
